package com.hireceivecard.config;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/*******************************
 * @Author: lili
 * @Email: 974196651@qq.com
 * @CreateTime: 2024/3/24 12:40
 * @Describe: JWT工具类
 *******************************/
public class JwtUtil {
    /**
     * 过期时间一天，（备注、这里的时间应该放到yaml里、不然正式上线、真的容易忘了改、滑稽）
     * TODO 正式运行时修改为15分钟
     */
    private static final long EXPIRE_TIME = 24 * 60 * 60 * 1000;
    /**
     * token私钥
     */
    private static final String TOKEN_SECRET = "f96e287c1806450e805e32c0a6a0e418";

    /**
     * 校验token是否正确
     *
     * @param token 密钥
     * @return 是否正确
     */
    public static boolean verify(String token) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            if (jwt == null) {
                return false;
            }
            return true;
        } catch (Exception exception) {
            return false;
        }
    }

    /**
     * 获取登陆用户ID
     * @param token
     * @return
     */
    public static String getUserId(String token) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            //如果没有上面的验证，也可以直接使用JWT.decode(token)返回jwt然后再getClaims()
            Map<String, Claim> claims = jwt.getClaims();
            return jwt.getClaim("account").asString();
        } catch (JWTDecodeException | UnsupportedEncodingException e) {
            return null;
        }
    }
    /**
     * 获取登陆用户手机号
     * @param token
     * @return
     */
    public static String getUserTelephone(String token) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            //如果没有上面的验证，也可以直接使用JWT.decode(token)返回jwt然后再getClaims()
            Map<String, Claim> claims = jwt.getClaims();
            return jwt.getClaim("telephone").asString();
        } catch (JWTDecodeException | UnsupportedEncodingException e) {
            return null;
        }
    }

    /**
     * 生成签名
     * @param hashMap 用户数据
     * @return 加密的token
     */
    public static String sign(HashMap<String, String> hashMap) {
        try {
            // 过期时间
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            // 私钥及加密算法
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            // 设置头部信息
            // typ 是type（类型）的简写，值为"JWT"代表JWT类型
            // alg是加密算法的简写，值为"HS256"代表加密方式为HS256
            Map<String, Object> header = new HashMap<>(2);
            header.put("typ", "JWT");
            header.put("alg", "HS256");

            JWTCreator.Builder jwtBuild = JWT.create().withHeader(header);
            // 将用户信息传入
            for (Map.Entry<String, String> entry : hashMap.entrySet()) {
                String key = entry.getKey();
                String value = entry.getValue();
                jwtBuild.withClaim(key, value);
            }
            return jwtBuild.withExpiresAt(date).sign(algorithm);
        } catch (UnsupportedEncodingException e) {
            return null;
        }
    }
}
